`include "param.v"
module top(
    input               clk     ,
    input               rst_n   ,
    //摄像头接口
    input               cmos_vsync      ,
    input               cmos_pclk       ,//ov5640给的像素时钟84MHz
    input               cmos_href       ,//行
    input   [7:0]       cmos_din        ,//输入的数据
    input               key1            ,
    input               key2            ,
    output              cmos_xclk       ,//24MHz
    output              cmos_pwdn       ,
    output              cmos_reset      ,
    output              cmos_scl        ,
    inout               cmos_sda        ,//用于配置的接口
    //sdram
    output              sdram_clk       ,
    output              sdram_cke       ,   
    output              sdram_csn       ,   
    output              sdram_rasn      ,   
    output              sdram_casn      ,   
    output              sdram_wen       ,   
    output  [1:0]       sdram_bank      ,   
    output  [12:0]      sdram_addr      ,   
    inout   [15:0]      sdram_dq        ,   
    output  [1:0]       sdram_dqm       ,
    output  [15:0]      vga_rgb         , 
    output              vga_hsync       ,
    output              vga_vsync       ,
    //数码管接口
	output  [ 5:0]  	seg_sel		, // 数码管位选，最左侧数码管为最高位
	output  [ 7:0]  	seg_led		,	 // 数码管段选 

    //蜂鸣器
    output          beep_en	,

 	// 添加LED输出端口
	output 	 [3:0] 		led 
);

//信号定义  
    wire            cfg_done        ;
    wire            clk_cmos        ;
    wire    [15:0]  pixel           ; 
    wire    [15:0]  pro_dout        ;
    wire            pixel_vld       ;
    wire            pro_valid       ; 
    wire            pixel_sop       ; 
    wire            pro_sop         ;
    wire            pixel_eop       ;
    wire            pro_eop         ; 

    wire            clk_100m        ;
    wire            clk_100m_s      ;
    wire            clk_vga         ;
    wire            pclk            ;
    wire            rd_req          ; 
    wire    [15:0]  dout            ; 
    wire            dout_vld        ; 
    wire            start           ;
    wire            sys_rst_n       ;
    wire		[ 1:0 ]			    key_flag			;
    wire		[ 1:0 ]			    key_value			;
    
    //系统复位，相机开始配置，至少需要
    assign sys_rst_n = start & cfg_done;//配置完成后
    assign cmos_xclk = clk_cmos;//24MHz
    assign sdram_clk = clk_100m_s;

//模块例化
    pll0 u_pll0(
	.areset (~rst_n     ),
	.inclk0 (clk        ),
	.c0     (clk_cmos   ),//24MHz，ov5640的输入时钟
    .c1     (clk_vga    )//75MHz，1280*720的时钟
   );
    
    //相位偏移
    pll1 u_pll1(
	.areset (~rst_n     ),
	.inclk0 (clk        ),
	.c0     (clk_100m   ),//给sdram的时钟
	.c1     (clk_100m_s ),//为什么要分频两个100
	.locked ()
    );

//什么作用，延时
    iobuf u_iobuf(
	.datain     (cmos_pclk  ),
    .dataout    (pclk       )
    );

    sys_rst u_sys_rst(
    /*input               */.clk  (clk      ),//50MHz
    /*input               */.rst_n(rst_n    ),//系统复位
    /*output              */.start(start    )
    );

    cmos_top u_cmos(
    /*input           */.clk     (clk       ),
    /*input           */.rst_n   (start     ),//比系统复位延时1.25s，然后持续1.25s的低电平再拉高
    /*output          */.scl     (cmos_scl  ),
    /*inout           */.sda     (cmos_sda  ),
    /*output          */.pwdn    (cmos_pwdn ),
    /*output          */.reset   (cmos_reset),
    /*output          */.cfg_done(cfg_done  )
    );

    capture u_capture(
    /*input           */.clk     (pclk      ),//84MHz
    /*input           */.rst_n   (sys_rst_n ),
    /*input           */.vsync   (cmos_vsync),//场同步信号
    /*input           */.href    (cmos_href ),//行有效
    /*input   [7:0]   */.din     (cmos_din  ),//数据
    /*input           */.enable  (cfg_done  ),//是否配置完成
    /*output  [15:0]  */.dout    (pixel     ),//输出16bit
    /*output          */.dout_vld(pixel_vld ),//输出有效rgb565
    /*output          */.dout_sop(pixel_sop ),//一张图片开始
    /*output          */.dout_eop(pixel_eop )//一张图片结束
    );

    //图像数据处理模块例化
    process u_process(
    	.clk          (pclk         ),
        .rst_n        (sys_rst_n    ),
        .rgb_din      (pixel        ),
        .rgb_valid    (pixel_vld    ),
        .rgb_sop      (pixel_sop)    ,
        .rgb_eop      (pixel_eop)   ,
        .pro_dout     (pro_dout     ),
        .pro_valid    (pro_valid    ),
        .pro_sop      (pro_sop),
        .pro_eop      (pro_eop)
    );

    sdram_controller u_mem_controller(
    /*input           */.clk     (clk_100m      ),//100M 控制器主时钟
    /*input           */.clk_in  (pclk          ),//数据输入时钟84MHz
    /*input           */.clk_out (clk_vga       ),//75MHz
    /*input           */.rst_n   (sys_rst_n     ),
    /*input   [15:0]  */.din     (pro_dout         ),//输入到sdram的数据
    /*input           */.din_vld (pro_valid     ),//有效输入信号
    /*input           */.din_sop (pro_sop     ),
    /*input           */.din_eop (pro_eop     ),
    /*input           */.rd_req  (rd_req        ),//读请求
    /*output  [15:0]  */.dout    (dout          ),//
    /*output          */.dout_vld(dout_vld      ),
    //sdram接口
    /*output          */.cke     (sdram_cke     ),
    /*output          */.csn     (sdram_csn     ),
    /*output          */.rasn    (sdram_rasn    ),
    /*output          */.casn    (sdram_casn    ),
    /*output          */.wen     (sdram_wen     ),
    /*output  [1:0]   */.bank    (sdram_bank    ),
    /*output  [12:0]  */.addr    (sdram_addr    ),
    /*inout   [15:0]  */.dq      (sdram_dq      ),
    /*output  [1:0]   */.dqm     (sdram_dqm     )    
);

    vga_interface u_vga(
    /*input           */.clk      (clk_vga   ),
    /*input           */.rst_n    (sys_rst_n ),
    /*input   [15:0]  */.din      (dout      ),
    /*input           */.din_vld  (dout_vld  ),
    /*output          */.rdy      (rd_req    ),
    /*output  [15:0]  */.vga_rgb  (vga_rgb   ),
    /*output          */.vga_hsync(vga_hsync ),
                        .key1     (!key1_value && key1_flag),
                        .key2     (!key2_value && key2_flag),
    /*output          */.vga_vsync(vga_vsync )
    );

    //按键消抖
    key_debounce u_key_debounce0(
    .clk   ( clk ),
    .rst_n ( rst_n ),
    .key   ( key1),
    .flag  ( key1_flag),
    .key_value  ( key1_value)
    );

    key_debounce u_key_debounce1(
    .clk   ( clk ),
    .rst_n ( rst_n ),
    .key   ( key2),
    .flag  ( key2_flag),
    .key_value  ( key2_value)
    );

    key_debounce u_key_debounce2(
    .clk   ( clk ),
    .rst_n ( rst_n ),
    .key   ( key3),
    .flag  ( key3_flag),
    .key_value  ( key3_value)
    );

    //数码管显示
    seg_led u_seg_led(
		//in
	    .clk         	(clk		),//给系统时钟
		.rst_n       	(rst_n		),
		
		.data            (17'd123456	),//6位数码管显示的分数  
		.en              (1		),
		.point           (6'b000000		),
		.sign            (1		),
		
		//out
		.seg_led         (seg_led),
		.seg_sel         (seg_sel)
	);

    reg beep_1;
// 按键处理逻辑
reg key1_last_state; // 存储上一次的key1状态，用于检测下降沿
reg en;              // 使能信号，高电平表示按键已触发

// 计时器逻辑
reg [21:0] timer;    // 计时器，用于实现2秒的延时

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        // 异步复位，初始化信号
        key1_last_state <= 1'b0;
        en <= 1'b0;
        timer <= 22'd0; // 根据实际时钟频率调整计数值以实现2秒延时
    end else begin
        // 检测key1的下降沿
        if (!key1 && key1_last_state) begin
            // 重置计时器并设置使能信号
            timer <= 22'd1000000 - 1; // 75MHz时钟频率下，大约2秒的计数值
            en <= 1'b1;
        end else if (en) begin
            // 使能信号为高时，递减计时器
            if (timer > 0) begin
                timer <= timer - 1;
            end else begin
                en <= 1'b0; // 计时结束，重置使能信号
            end
        end
        
        // 更新key1状态以检测下一个下降沿
        key1_last_state <= key1;
    end
end


//led闪烁
led u_led(
	//in
	.sys_clk		(clk				),     
    .sys_rst_n		(rst_n				),    
    .trigger		( en	),    // 触发LED闪烁的信号
	//out
    .led			(led				)     // 连接到LED的输出
);



    //蜂鸣器触发
	beep u_beep(
		//in
	    .sys_clk         (clk),
		.sys_rst_n       (rst_n),
		.trigger     ( en ),//连接触发BUZZER响的信号
	
		//OUT
		.beep_en         (beep_en)
		);




endmodule




